/*
-------------------------------------------
    Rodeo Game Engine
    Rodeo Renderer Module
    ShadersInterface.h - header file
    Copyright(c) Marcin Goryca
-------------------------------------------
*/
#ifndef RODEO_RENDERER_SHADERSINTERFACE_H_
#define RODEO_RENDERER_SHADERSINTERFACE_H_

#ifndef RODEO_CORE_CONSTANTS_H_
#include "core\constants.h"
#endif    // RODEO_CORE_CONSTANTS_H_

namespace rodeorenderer
{
class ShadersInterface
{
public:
    ShadersInterface(){}
    virtual ~ShadersInterface(){}

    // [Pure Virtual]
    // Loads Shader Program from specified file
    // Parameter ShaderType use RODEO_VS (VERTEX SHADER), RODEO_FS (FRAGMENT SHADER)
    virtual rodeocore::ui loadShaderFromFile(const char* filename, rodeocore::ShaderType st) = 0;

    // [Pure Virtual]
    // Inits Shaders
    virtual void init() = 0;

    virtual void useShaderProgram(rodeocore::ui shader_program) = 0;

    // [Pure Virtual]
    // Gets Vertex Shader Id
    // Returns unsigned int vertex shader id
    virtual rodeocore::ui getVertexShader() const = 0;

    // [Pure Virtual]
    // Sets Vertex Shader Id
    // Parameter unsigned int new vertex shader id
    virtual void setVertexShader(rodeocore::ui id) = 0;

    // [Pure Virtual]
    // Gets Fragment Shader Id
    // Returns unsigned int fragment shader id
    virtual rodeocore::ui getFragmentShader() const = 0;

    // [Pure Virtual]
    // Sets Fragment Shader Id
    // Parameter unsigned int new fragment shader id
    virtual void setFragmentShader(rodeocore::ui id) = 0;

    // [Pure Virtual]
    // Gets Vertex Shader Program File
    // Returns const char* string of vertex shader program file
    virtual const char* getVertexProgramFile() const = 0;

    // [Pure Virtual]
    // Sets Vertex Shader Program File
    // Parameter const char* new string of vertex shader program file
    virtual void setVertexProgramFile(const char* vpf) = 0;

    // [Pure Virtual]
    // Gets Fragment Shader Program File
    // Returns const char* string of fragment shader program file
    virtual const char* getFragmentProgramFile() const = 0;

    // [Pure Virtual]
    // Sets Fragment Shader Program File
    // Parameter const char* new string of fragment shader program file
    virtual void setFragmentProgramFile(const char* fpf) = 0;

    // [Pure Virtual]
    // Gets Shader Program Id
    // Returns unsigned int shader program id
    virtual rodeocore::ui getProgram() const = 0;

    // [Pure Virtual]
    // Sets Shader Program Id
    // Parameter unsigned int new id for shader program
    virtual void setProgram(rodeocore::ui program) = 0;

//==== MEMBERS ====//
protected:
    rodeocore::ui vertex_shader_;
    rodeocore::ui fragment_shader_;
    rodeocore::ui program_;

    const char* vertex_program_file_;
    const char* fragment_program_file_;
};
}    // end of rodeorenderer namespace
#endif // RODEO_RENDERER_SHADERSINTERFACE_H_